
// 因为作者没实力而自定义
//#define BianYi

// 标准头文件
#include <stdio.h>
#include <malloc.h>
//#include <stdlib.h>
//#include <stddef.h>
#include <fcntl.h>
#include <unistd.h>

// 自定义头文件
#include "./内存工具.hpp"

// 函数声明
int main(void);

// 函数定义
int main(void) {
  // 变量声明
  const char *包名 = "cn.dcsofficial.dcs";
  pid_t PID;
  char 内存文件路径[1 + 4 + 1 + 5 + 1 + 3 + 1];
  int fd_mem;
  long 读取偏移;
  int 角度;
  char maps文件路径[29 + 1];
  FILE *fd_maps;
  char i;
  // 开始执行
  // 获取PID
  PID = neiCunGongJv_AL::get_PID(包名);
  if(!PID) {
    printf("[函数:%s] 获取PID失败\n", __func__);
    goto _pid获取失败;
  }
  printf("[函数:%s] PID为:%d\n", __func__, PID);
  // 打开内存
  sprintf(内存文件路径, "/proc/%d/mem", PID); // 更改字符串内容前先更改数组大小
  fd_mem = open(内存文件路径, O_RDWR);
  if(fd_mem == -1) {
    printf("[函数:%s] 内存文件打开失败\n", __func__);
    goto _内存文件打开失败;
  }
  // 读内存
  printf("[函数:%s] 请输入读取偏移(16进制):>", __func__);
  scanf("%lx", &读取偏移);
  lseek64(fd_mem, 读取偏移, SEEK_SET);
  if(read(fd_mem, &角度, sizeof(角度)) == -1) {
    printf("[函数:%s] 内存文件读取失败\n", __func__);
    goto _内存文件读取失败;
  }
  printf("[函数:%s] 读取到的角度为:%d\n", __func__, 角度);
  printf("[函数:%s] 地址为:%ld, 开始搜索基质\n", __func__, 读取偏移);
  // 找基址
  sprintf(maps文件路径, "grep '\\.so$' /proc/%d/maps", PID); // 更改字符串内容前先更改数组大小
  fd_maps = popen(maps文件路径, "r"); // 执行过滤maps文件命令
  if(!fd_maps) {
    printf("[函数:%s] maps过滤失败\n", __func__);
    goto _maps文件打开失败;
  }
  while((i = (char)fgetc(fd_maps)) != (char)EOF) {
    putchar(i);
  }
  putchar('\n');

  // 结束
  pclose(fd_maps);
_maps文件打开失败:
_内存文件读取失败:
  close(fd_mem);
_内存文件打开失败:
_pid获取失败:
  return(0);
}

